# -*- coding: utf8 -*-
# *********** necessario para importacao da biblioteca python-ldap no chroot **********************$
import sys
modulos_path = '/var/www/ncdsis/libs'
if  modulos_path not in sys.path:
  sys.path.append(modulos_path)
# *************************** fim ****************************************************************$

import sys, traceback
from django.conf import settings
from django.contrib.auth.models import User, Group


uri = settings.LDAP_URI          # ldap://ldap.ncd.org.bri
dn = settings.LDAP_DN_USERS      # ou=users,ou=vitoria,dc=ncd,dc=org,dc=br
senha = settings.LDAP_SENHA      #'OBce15m,ve?'
grupos = settings.LDAP_GRUPOS    #['monitor','aluno','secretarios']


class LdapBackend:
    """
    Backend que autentica em uma base ldap.
    Este é especifico para o ncd.
    """
    def authenticate(self, username=None, password=None):
        if username is None or password is None or password == '':
            return None
        try: 
	    import ldap
            conn=ldap.initialize(uri)
	except:
	    print "-"*60
	    traceback.print_exc(file=sys.stdout)
	    print "-"*60
	    return None

        # tenta autenticar o usuario em todos os grupos possiveis ou então desiste
        for g in grupos:
            try:
                dn_usuario='uid=%s,ou=%s,%s' % (username,g,dn)
                print "tentando se autenticar com o seguinte dn de usuario:%s"% dn_usuario
                conn.simple_bind_s(dn_usuario,password)
                return self.retorne_user(username,password,grupo=g)
            except ldap.INVALID_CREDENTIALS:
                print "senha incorreta"
            except:
		print "Exception in user code:"
	        print '-'*60
		traceback.print_exc(file=sys.stdout)
		print '-'*60

                print "Unexpected error:", sys.exc_info()
		print password, username
                return None

        return None
     
    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None
    
    def retorne_user(self,username,password,grupo): 
        try:
            user = User.objects.get(username=username)
            user.set_password(password)
        except User.DoesNotExist:
            user = User(username=username)
            user.set_password(password)
            user.is_staff = True
	user.save() # para poder salvar o grupo
        grupo_ncdsis = Group.objects.get(name=settings.NCDSIS_GRUPOS[grupo])
        user.groups.add(grupo_ncdsis)
        user.save()
        return user
